package com.freemalll.system.service.impl;

import java.util.List;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.freemalll.common.core.constant.UserConstants;
import com.freemalll.common.core.exception.ServiceException;
import com.freemalll.common.core.utils.StringUtils;
import com.freemalll.system.domain.SysAccount;
import com.freemalll.system.mapper.SysAccountMapper;
import com.freemalll.system.service.ISysAccountService;

/**
 * 系统账户 服务层实现
 * 
 * @author freemalll
 */
@Service
public class SysAccountServiceImpl implements ISysAccountService
{
    @Autowired
    private SysAccountMapper accountMapper;

    /**
     * 查询系统账户信息
     * 
     * @param id 账户ID
     * @return 系统账户信息
     */
    @Override
    public SysAccount selectAccountById(String id)
    {
        return accountMapper.selectAccountById(id);
    }

    /**
     * 根据登录名称查询账户信息
     * 
     * @param accountId 登录名称
     * @return 系统账户信息
     */
    @Override
    public SysAccount selectAccountByAccountId(String accountId)
    {
        return accountMapper.selectAccountByAccountId(accountId);
    }

    /**
     * 根据手机号查询账户信息
     * 
     * @param mobile 手机号
     * @return 系统账户信息
     */
    @Override
    public SysAccount selectAccountByMobile(String mobile)
    {
        return accountMapper.selectAccountByMobile(mobile);
    }

    /**
     * 根据身份证号查询账户信息
     * 
     * @param idCard 身份证号
     * @return 系统账户信息
     */
    @Override
    public SysAccount selectAccountByIdCard(String idCard)
    {
        return accountMapper.selectAccountByIdCard(idCard);
    }

    /**
     * 根据唯一标识查询账户信息
     * 
     * @param unionid 唯一标识
     * @return 系统账户信息
     */
    @Override
    public SysAccount selectAccountByUnionid(String unionid)
    {
        return accountMapper.selectAccountByUnionid(unionid);
    }

    /**
     * 查询系统账户列表
     * 
     * @param account 系统账户信息
     * @return 系统账户集合
     */
    @Override
    public List<SysAccount> selectAccountList(SysAccount account)
    {
        return accountMapper.selectAccountList(account);
    }

    /**
     * 新增系统账户
     * 
     * @param account 系统账户信息
     * @return 结果
     */
    @Override
    public int insertAccount(SysAccount account)
    {
        return accountMapper.insert(account);
    }

    /**
     * 修改系统账户
     * 
     * @param account 系统账户信息
     * @return 结果
     */
    @Override
    public int updateAccount(SysAccount account)
    {
        return accountMapper.updateById(account);
    }

    /**
     * 批量删除系统账户
     * 
     * @param ids 需要删除的账户ID
     */
    @Override
    public void deleteAccountByIds(String[] ids)
    {
        for (String id : ids)
        {
            SysAccount account = selectAccountById(id);
            if (StringUtils.isNotNull(account))
            {
                // 检查是否为超级管理员账户
                if (StringUtils.equals("admin", account.getAccountTypeCode()))
                {
                    throw new ServiceException("超级管理员账户不能删除");
                }
                accountMapper.deleteAccountById(id);
            }
        }
    }

    /**
     * 删除系统账户信息
     * 
     * @param id 账户ID
     * @return 结果
     */
    @Override
    public int deleteAccountById(String id)
    {
        SysAccount account = selectAccountById(id);
        if (StringUtils.isNotNull(account) && StringUtils.equals("admin", account.getAccountTypeCode()))
        {
            throw new ServiceException("超级管理员账户不能删除");
        }
        return accountMapper.deleteAccountById(id);
    }

    /**
     * 校验登录名称是否唯一
     * 
     * @param account 账户信息
     * @return 结果
     */
    @Override
    public boolean checkAccountIdUnique(SysAccount account)
    {
        String id = StringUtils.isNull(account.getId()) ? "-1" : account.getId();
        SysAccount info = accountMapper.selectAccountByAccountId(account.getAccountId());
        if (StringUtils.isNotNull(info) && !info.getId().equals(id))
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    /**
     * 校验手机号是否唯一
     * 
     * @param account 账户信息
     * @return 结果
     */
    @Override
    public boolean checkMobileUnique(SysAccount account)
    {
        String id = StringUtils.isNull(account.getId()) ? "-1" : account.getId();
        SysAccount info = accountMapper.selectAccountByMobile(account.getMobile());
        if (StringUtils.isNotNull(info) && !info.getId().equals(id))
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    /**
     * 校验身份证号是否唯一
     * 
     * @param account 账户信息
     * @return 结果
     */
    @Override
    public boolean checkIdCardUnique(SysAccount account)
    {
        String id = StringUtils.isNull(account.getId()) ? "-1" : account.getId();
        SysAccount info = accountMapper.selectAccountByIdCard(account.getIdCard());
        if (StringUtils.isNotNull(info) && !info.getId().equals(id))
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    /**
     * 校验唯一标识是否唯一
     * 
     * @param account 账户信息
     * @return 结果
     */
    @Override
    public boolean checkUnionidUnique(SysAccount account)
    {
        String id = StringUtils.isNull(account.getId()) ? "-1" : account.getId();
        SysAccount info = accountMapper.selectAccountByUnionid(account.getUnionid());
        if (StringUtils.isNotNull(info) && !info.getId().equals(id))
        {
            return UserConstants.NOT_UNIQUE;
        }
        return UserConstants.UNIQUE;
    }

    /**
     * 重置账户密码
     * 
     * @param account 账户信息
     * @return 结果
     */
    @Override
    public int resetAccountPassword(SysAccount account)
    {
        return accountMapper.updateById(account);
    }

    /**
     * 修改账户状态
     * 
     * @param account 账户信息
     * @return 结果
     */
    @Override
    public int changeAccountStatus(SysAccount account)
    {
        return accountMapper.updateById(account);
    }

    /**
     * 锁定/解锁账户
     * 
     * @param account 账户信息
     * @return 结果
     */
    @Override
    public int lockAccount(SysAccount account)
    {
        return accountMapper.updateById(account);
    }

    /**
     * 增加异常次数
     * 
     * @param accountId 登录名称
     * @return 结果
     */
    @Override
    public int increaseAbnormalCount(String accountId)
    {
        SysAccount account = selectAccountByAccountId(accountId);
        if (StringUtils.isNotNull(account))
        {
            int currentCount = account.getAbnormalCount() != null ? account.getAbnormalCount() : 0;
            int maxCount = account.getAbnormalCountMax() != null ? account.getAbnormalCountMax() : 10;
            
            account.setAbnormalCount(currentCount + 1);
            
            // 如果异常次数达到最大值，锁定账户
            if (account.getAbnormalCount() >= maxCount)
            {
                account.setLocking(true);
            }
            
            return accountMapper.updateById(account);
        }
        return 0;
    }

    /**
     * 重置异常次数
     * 
     * @param accountId 登录名称
     * @return 结果
     */
    @Override
    public int resetAbnormalCount(String accountId)
    {
        SysAccount account = selectAccountByAccountId(accountId);
        if (StringUtils.isNotNull(account))
        {
            account.setAbnormalCount(0);
            account.setLocking(false);
            return accountMapper.updateById(account);
        }
        return 0;
    }
}